<?php

namespace Sisesporte\Utils;

class Utils {

    public function DataBrasilEua($data) {
        list($day, $month, $year) = explode("/", $data);
        return $year . "-" . $month . "-" . $day;
    }

    public function DataEuaBrasil($data) {
        list($year, $month, $day) = explode("-", $data);
        return $day . "/" . $month . "/" . $year;
    }

    public function DataAtualEua($data) {
        return date("Y-m-d ");
    }

    public function DataAtualBrasil() {
        return date("d-m-Y");
    }

    public function valideDate($date, $format = 'DD/MM/YYYY') {
        if (strlen($date) >= 8 && strlen($date) <= 10) {
            $separator_only = str_replace(array('M', 'D', 'Y'), '', $format);
            $separator = $separator_only[0];
            if ($separator) {
                $regexp = str_replace($separator, "\\" . $separator, $format);
                $regexp = str_replace('MM', '(0[1-9]|1[0-2])', $regexp);
                $regexp = str_replace('M', '(0?[1-9]|1[0-2])', $regexp);
                $regexp = str_replace('DD', '(0[1-9]|[1-2][0-9]|3[0-1])', $regexp);
                $regexp = str_replace('D', '(0?[1-9]|[1-2][0-9]|3[0-1])', $regexp);
                $regexp = str_replace('YYYY', '\d{4}', $regexp);
                $regexp = str_replace('YY', '\d{2}', $regexp);
                if ($regexp != $date && preg_match('/' . $regexp . '$/', $date)) {
                    foreach (array_combine(explode($separator, $format), explode($separator, $date)) as $key => $value) {
                        if ($key == 'YY') {
                            $year = '20' . $value;
                        }
                        if ($key == 'YYYY') {
                            $year = $value;
                        }
                        if ($key[0] == 'M') {
                            $month = $value;
                        }
                        if ($key[0] == 'D') {
                            $day = $value;
                        }
                    }
                    if (checkdate($month, $day, $year)) {
                        return TRUE;
                    }
                }
            }
        }
        return FALSE;
    }

    public function DateToDatetime($date) {
        $newDate = new DateTime($this->DataBrasilEua($date));
        return $newDate;
    }

    public function populateEntityFromArray($entity, array $data) {
        foreach ($data as $key => $value) {

            $noCampo = "set" . ucfirst($key);

            if (method_exists($entity, $noCampo)) {
                $data = $value;
                if (is_string($value)) {
                    if ((strlen($value) >= 8 && strlen($value) <= 10)) {
                        $arr = explode('/', $value);

                        if ((strlen($arr[1]) == 2) && (strlen($arr[0]) == 2) && (strlen($arr[2]) == 4)) {
                            if (checkdate($arr[1], $arr[0], $arr[2])) {
                                $data = $this->DateToDatetime($value);
                            }
                        }
                    }
                }

                if (!is_object($data)) {
                    $value = str_replace('R$', '', $value);
                    if ((int) $value > 0) {
                        $data = str_replace('.', '', $value);
                        $data = str_replace(',', '.', $data);
                    }
                }

                $entity->$noCampo($data);
            }
        }

        return $entity;
    }

    /**
     * Verifica se o CPF é Válido.
     * @param string $cpf
     */
    public function validaCpf($cpf) {
        $cpf = str_pad(str_replace(array("-", ".", " "), "", $cpf), 11, '0', STR_PAD_LEFT);
        if (strlen($cpf) != 11
                || $cpf == '00000000000' || $cpf == '11111111111'
                || $cpf == '22222222222' || $cpf == '33333333333'
                || $cpf == '44444444444' || $cpf == '55555555555'
                || $cpf == '66666666666' || $cpf == '77777777777'
                || $cpf == '88888888888' || $cpf == '99999999999') {
            return FALSE;
        } else {
            for ($t = 9; $t < 11; $t++) {
                for ($d = 0, $c = 0; $c < $t; $c++) {
                    $d += $cpf{$c} * (($t + 1) - $c);
                }
                $d = ((10 * $d) % 11) % 10;

                if ($cpf{$c} != $d) {
                    return FALSE;
                }
            }

            return TRUE;
        }
    }

    public static function unSerializeForm($str) {
        if (!empty($str)) {
            if (is_string($str)) {
                $arr = explode('&', $str);
                foreach ($arr as $val) {
                    $arrUnSerialize = explode('=', $val);
                    $key = $arrUnSerialize[0];
                    $value = trim($arrUnSerialize[1]);
                    if (isset($arrValue[$key])) {
                        if (is_array($arrValue[$key])) {
                            array_push($arrValue[$key], urldecode($value));
                        } else {
                            $arrValue[$key] = array($arrValue[$key], urldecode($value));
                        }
                    } else {
                        $arrValue[$key] = urldecode($value);
                    }
                }

                return $arrValue;
            }
        }

        return array();
    }

    public function retiraMaskTel($campo){
        $var = array("(",")","-"," ");
        $codigoLimpo = str_replace($var, '', $campo);
        
        return $codigoLimpo;
    }
    
    public function MaskTel($campo){
        $var = array("(",")","-"," ");
        $codigoLimpo = str_replace($var, '', $campo);
        $mascara = "(##) ####-####";
        $indice = -1;
            for ($i = 0; $i < strlen($mascara); $i++) {
                if ($mascara[$i] == '#') {
                    $mascara[$i] = $codigoLimpo[++$indice];
                }
            }
        return $mascara;
    }

    public function MaskFoto($campo){
        $var = array(" ");
        $codigoLimpo = str_replace($var, '', $campo);
        $mascara = "####_#####";
        $indice = -1;
            for ($i = 0; $i < strlen($mascara); $i++) {
                if ($mascara[$i] == '#') {
                    $mascara[$i] = $codigoLimpo[++$indice];
                }
            }
        return $mascara;
        
    }
    
    public function MaskCEP($campo){
        $var = array(" ");
        $codigoLimpo = str_replace($var, '', $campo);
        $mascara = "#####-###";
        $indice = -1;
            for ($i = 0; $i < strlen($mascara); $i++) {
                if ($mascara[$i] == '#') {
                    $mascara[$i] = $codigoLimpo[++$indice];
                }
            }
        return $mascara;
        
    }
    
    public function MaskNuInscricao($campo){
        $var = array(" ");
        $codigoLimpo = str_replace($var, '', $campo);
        $mascara = "####/#####";
        $indice = -1;
            for ($i = 0; $i < strlen($mascara); $i++) {
                if ($mascara[$i] == '#') {
                    $mascara[$i] = $codigoLimpo[++$indice];
                }
            }
        return $mascara;
        
    }
    
    public function formatarCpfCnpj($campo, $formatado = TRUE) {
        $var = array("-", ".", "/", " ");
        $codigoLimpo = str_replace($var, '', $campo);
        $tamanho = (strlen($codigoLimpo) - 2);

        if ($tamanho != 9 && $tamanho != 12) {
            return FALSE;
        }

        if ($formatado) {
            $mascara = ($tamanho == 9) ? '###.###.###-##' : '##.###.###/####-##';

            $indice = -1;
            for ($i = 0; $i < strlen($mascara); $i++) {
                if ($mascara[$i] == '#') {
                    $mascara[$i] = $codigoLimpo[++$indice];
                }
            }
            $retorno = $mascara;
        } else {
            $retorno = $codigoLimpo;
        }

        return $retorno;
    }

    //Função que retorna a quantidade anos que o integrante reside nunha unidade
    public function otherDiffDate($end, $out_in_array) {
        $intervalo = date_diff(date_create(), date_create($end));
        $out = $intervalo->format("%Y anos e %M mês");
        if (!$out_in_array) {
            return $out;
        }
        $a_out = array();
        array_walk(explode(',', $out), function($val, $key) use(&$a_out) {
                    $valor = explode(':', $val);
                    $a_out[$valor[0]] = $valor[1];
                });
        return $a_out;
    }

    public function resultStatus($value) {
        if ($value == 1) {
            return "Sim";
        }
        return "Não";
    }

    /**
     * Retorna o valor de dias entre as datas
     *
     * @param $dtInicio (MM/DD/AAAA) $dtFinal (MM/DD/AAAA) $separador
     * @return Integer
     */
    public function diferencaDatas($dtInicio, $dtFinal, $separador) {

        $data1 = explode($separador, $dtInicio);
        $data2 = explode($separador, $dtFinal);
        //mes        dia        ano
        $var1 = mktime(0, 0, 0, $data1[1], $data1[0], $data1[2]);
        $var2 = mktime(0, 0, 0, $data2[1], $data2[0], $data2[2]);
        //retorna valor positivo
        return abs(floor(($var2 - $var1) / 86400));
    }

    /**
     *
     * verifica se a data inicial é menor ou maior que a final
     * @name dateInicialMaiorFinal
     * @access access
     * @return @param $dtInicio
     * @return @param $dtFinal
     * @return @param $separador
     */
    public function dateInicialMaiorFinal($dtInicio = NULL, $dtFinal = NULL, $separador = NULL) {
        if (!is_null($dtInicio)) {
            $result = FALSE;

            $data1 = explode($separador, $dtInicio);
            $data2 = explode($separador, $dtFinal);

            $var1 = mktime(0, 0, 0, $data1[1], $data1[0], $data1[2]);
            $var2 = mktime(0, 0, 0, $data2[1], $data2[0], $data2[2]);

            return (floor(($var2 - $var1) / 86400) > 0) ? TRUE : FALSE;
        }
    }

    /**
     * Retorna a string com máscara passada como parâmetro
     *
     * @param $dtInicio (MM/DD/AAAA) $dtFinal (MM/DD/AAAA) $separador
     * @return Integer
     *
     */
    public function formatarString($mascara, $string) {
        $string = str_replace(" ", "", $string);
        for ($i = 0; $i < strlen($string); $i++) {
            $mascara[strpos($mascara, "#")] = $string[$i];
        }
        return $mascara;
    }

    /**
     * Transforma data no formato d/m/Y em objeto DateTime
     *
     * @param $dataIn
     * @return DateTime
     */
    public function formataDateFromDateTime($dataIn, $hourIn = FALSE) {
        if ($dataIn) {
            list($day, $month, $year) = explode("/", $dataIn);
            if ($hourIn) {
                return new \DateTime(date($year . "-" . $month . "-" . $day) . " {$hourIn}");
            } else {
                return new \DateTime(date($year . "-" . $month . "-" . $day));
            }
        } else {
            return NULL;
        }
    }

    /**
     * Transforma objeto DateTime no formato date d/m/Y
     *
     * @param $dateTimeIn
     * @return Date
     */
    public function formataDateTimeToDate($dataTimeIn, $withHour = false) {
        if (is_object($dataTimeIn)) {
            if ($withHour) {
                return $dataTimeIn->format('d/m/Y H:m:s');
            } else {
                return $dataTimeIn->format('d/m/Y');
            }
        } else {
            return NULL;
        }
    }

    /**
     * Transforma valores 999.999,99 para 999999.99 para gravação no Banco
     *
     * @param $dateTimeIn
     * @return Date
     */
    public function formataValorToBanco($valorIn) {
        if ($valorIn) {
            $valorIn = str_replace('.', '', $valorIn);
            $valorIn = str_replace(',', '', $valorIn);

            return (int) $valorIn * 0.01;
        } else {
            return NULL;
        }
    }

    /**
     * Transforma valores de Banco de Dados 999999.99 para 999.999,99 para apresentação
     *
     * @param $dateTimeIn
     * @return Date
     */
    public function formataVlBancoToApresentacao($valorOut) {
        if ($valorOut) {
            return number_format($valorOut, 2, ',', '.');
        } else {
            return NULL;
        }
    }

    /**
     * Somar duas HH:MM dando o valor tambem em HH:MM
     *
     * @param string $horaIni
     * @param string $horaFim
     * @return string HH:MM
     */
    public function SomarHorasMinutos($horaIni, $horaFim) {
        $arrIni = explode(':', $horaIni);
        $arrFim = explode(':', $horaFim);

        $minutos = (($arrIni[1] + $arrFim[1]) % 60);

        $horas = ((int) ($arrIni[1] + $arrFim[1]) / 60) + ($arrIni[0] + $arrFim[0]);

        return $horas . ":" . str_pad($minutos, 2, "0", STR_PAD_LEFT);
    }

    /**
     * Retorna sexo
     *
     * @param string M ou S
     * @return string
     */
    function resultSexo($value) {
        if ($value == "M") {
            return "Masculino";
        }
        return "Feminino";
    }

    //-----------------------------------------------------
    //Funcao: validaCNPJ($cnpj)
    //Sinopse: Verifica se o valor passado é um CNPJ válido
    // Retorno: Booleano
    // Autor: Gabriel Fróes - www.codigofonte.com.br
    //-----------------------------------------------------
    function validaCNPJ($cnpj) {
        if (strlen($cnpj) <> 18)
            return 0;
        $soma1 = ($cnpj[0] * 5) +
                ($cnpj[1] * 4) +
                ($cnpj[3] * 3) +
                ($cnpj[4] * 2) +
                ($cnpj[5] * 9) +
                ($cnpj[7] * 8) +
                ($cnpj[8] * 7) +
                ($cnpj[9] * 6) +
                ($cnpj[11] * 5) +
                ($cnpj[12] * 4) +
                ($cnpj[13] * 3) +
                ($cnpj[14] * 2);
        $resto = $soma1 % 11;
        $digito1 = $resto < 2 ? 0 : 11 - $resto;
        $soma2 = ($cnpj[0] * 6) +
                ($cnpj[1] * 5) +
                ($cnpj[3] * 4) +
                ($cnpj[4] * 3) +
                ($cnpj[5] * 2) +
                ($cnpj[7] * 9) +
                ($cnpj[8] * 8) +
                ($cnpj[9] * 7) +
                ($cnpj[11] * 6) +
                ($cnpj[12] * 5) +
                ($cnpj[13] * 4) +
                ($cnpj[14] * 3) +
                ($cnpj[16] * 2);
        $resto = $soma2 % 11;
        $digito2 = $resto < 2 ? 0 : 11 - $resto;
        return (($cnpj[16] == $digito1) && ($cnpj[17] == $digito2));
    }

    public function gerarSenha($tamanho = 8, $maiusculas = true, $numeros = true, $simbolos = false) {
        $lmin = 'abcdefghijklmnopqrstuvwxyz';
        $lmai = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $num = '1234567890';
        $simb = '!@#$%*-';
        $retorno = '';
        $caracteres = '';

        $caracteres .= $lmin;
        if ($maiusculas)
            $caracteres .= $lmai;
        if ($numeros)
            $caracteres .= $num;
        if ($simbolos)
            $caracteres .= $simb;

        $len = strlen($caracteres);
        for ($n = 1; $n <= $tamanho; $n++) {
            $rand = mt_rand(1, $len);
            $retorno .= $caracteres[$rand - 1];
        }
        return $retorno;
    }
    
    public function calcularIdade($dataNasc) {
        $anoNascParts = explode("/", $dataNasc);
        $diaNasc = $anoNascParts[0];
        $mesNasc = $anoNascParts[1];
        $anoNasc = $anoNascParts[2];
        $idade = date('Y') - $anoNasc;
        $mesAtual = date("m");
        if ($mesAtual < $mesNasc) {
            $idade--;
        } else {
            if ($mesAtual == $mesNasc) {
                if (date('d') < $diaNasc) {
                    $idade--;
                }
            }
        }
        return $idade;
    }

}

